package 多线程.多线程同步的5种方法;

import java.util.Date;

/**
 * @author 廖述京
 * @date 2017/8/31.
 * @result 注：同步是一种高开销的操作，因此应该尽量减少同步的内容。通常没有必要同步整个方法，
 *         使用synchronized代码块同步关键代码即可。
 */
public class SyncCode_Bank {
    private int count = 0;//账户余额

    //存钱
    public void addMoney(int money) {
        synchronized (this) { //代码块被同步关键字修饰，即能保证此代码块一次只能被一个线程访问。this代表当前正在访问类中方法的对象
            count += money;
        }
        System.out.println(new Date(System.currentTimeMillis()).toLocaleString() + "存进：" + money);
    }

    //取钱
    public synchronized void subMoney(int money) {
        synchronized (this) { //代码块被同步关键字修饰，即能保证此代码块一次只能被一个线程访问。this代表当前正在访问类中方法的对象
            if (count - money < 0) {
                System.out.println("余额不足");
                return;
            }
            count -= money;
        }
        System.out.println(new Date(System.currentTimeMillis()).toLocaleString() + "取出：" + money);
    }

    //查询
    public void lookMoney() {
        System.out.println("账户余额：" + count);
    }
}
